package br.org.reconcavotecnologia.update19;

import br.org.reconcavotecnologia.update19.registro.MaquinaHashArquivo;
import br.org.reconcavotecnologia.update19.registro.MaquinaUpdate;

/**
 * Gerente da aplicação. Tudo começa aqui.
 * @author Cássio Oliveira
 * 
 * TODO Verificar todoList
 * TODO Verificar e resolver acoplamento de nomes - todos os nomes devem ser parametrizados e configuráveis
 * TODO Como atualizar o atualizador?? Quais os problemas que podem surgir??
 */
public class Update19 {

	/** Método para ser executado no lado do servidor */
	public static void runServerSide(String root, String ext) {
		MaquinaHashArquivo v = new MaquinaHashArquivo();
		try{
			v.start(root, ext);
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 *  Método para ser executado na máquina cliente. Segue o fluxo descrito abaixo:
	 *  	1 Baixa o arquivo com informações do servidor
	 *  	2 Gera o arquivo de configurações local
	 *  	3 Compara o arquivo local com o arquivo do servidor, definindo a lista de ações para atualização do sistema
	 *  	4 Executa as ações necessárias para atualizaçãod os sistema
	 */
	public static void runClientSide(String instalacaoServidor, String instalacaoLocal, String updateInfoServidor, String updateInfoLocal) {

		/*
		 * Gera o arquivo de hash local
		 */
		
		MaquinaHashArquivo v = new MaquinaHashArquivo();
		
		try{
			v.start(instalacaoLocal, "txt");
		}catch (Exception e) {
			e.printStackTrace();
		}

		MaquinaUpdate maquinaUpdate = new MaquinaUpdate(updateInfoLocal, instalacaoServidor, updateInfoServidor);

		/*
		 * Download do arquivo update.info do servidor
		 * Este arquivo contém as informações relativas a versão localizada no servidor
		 */
		
		maquinaUpdate.downloadInfoServidor();
		
		/*
		 * Compara as informações do servidor com as informações locais
		 * Aqui são mineradas as ações necessárias para atualizar o sistema
		 */

		maquinaUpdate.analizar();
		
		/*
		 * Realiza as atualizações necessárias
		 * Adiciona as ações obtidas do MaquinaUpdate e invoca os métodos de ações sobre os arquivos do sistema
		 */
		
		maquinaUpdate.executarAcoes();

	}
	
	public static void main(String[] args) {
//		Update19.runServerSide("/home/reconcavo/workspace/update19/docs/", "txt");
		Update19.runClientSide("http://update19.googlecode.com/svn/trunk/update19/docs/", "/home/reconcavo/workspace/update19/docs/", "update.info", "update.info");
	}
	
}
